home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
i
/
mtpopups.i
< prev
next >
Wrap
Text File
|
1997-10-26
|
16KB
|
463 lines
(*----------------------------------------------------------------------*
* *
* MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
* ÿ ÿ ÿ ÿ ÿ *
*----------------------------------------------------------------------*
* Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Dieses Modul ist urheberrechtlich geschtzt. *
* *
* Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
* Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
* oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
* boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
* Einverstndnisserklrung des Autors. *
* *
* Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
* fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
* Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
* widerrufen. *
*----------------------------------------------------------------------*)
IMPLEMENTATION MODULE mtPopups;
(*----------------------------------------------------------------------*
* Int. Vers | Datum | Name | nderung *
*-----------+----------+------+----------------------------------------*
* 3.00 | 18.01.92 | Hp | *
* 3.01 | 03.02.92 | Hp | Auf das neue MoveArea umgestellt. *
*-----------+----------+------+----------------------------------------*)
(* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
(* *)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*----------------------------------------------*)
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
TosVersion, Accessory, Basepage, SysHeader, TosDate;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM MagicAES IMPORT GBOX, GTEXT, GBOXTEXT, GIBOX, GSTRING, GTITLE,
Exit, DISABLED, SELECTABLE, OBJECT, ObjcDraw, ObjcFind, TEDINFO,
BEGMCTRL, ENDMCTRL, WindUpdate, WFFULLXYWH, WindGet,
FormButton, GrafHandle, MUKEYBD, MUBUTTON, MUM1,
MUM2, MUMESAG, MUTIMER, EvntMulti, AESIntIn, AESIntOut,
AESCall;
FROM mtAppl IMPORT PrivateWS, MouseOn, MouseOff, MouseArrow, MouseHand,
CharWidth, CharHeight, BoxWidth, BoxHeight, StoreMouse,
DeskX, DeskY, MaxWidth, MaxHeight, RestoreMouse;
FROM mtArea IMPORT AREA, NewAREA, DisposeAREA, FreeArea, SaveArea,
CopyArea, RestoreArea, MoveArea;
FROM mtUtils IMPORT tRect, tObjcTree, Bounce, ScanFlags, SearchType,
CalcArea, ObjcFrame, Max;
FROM mtMenubase IMPORT SameLength, DoEvent, ScreenDim, DrawBar, MenuKeyboard,
PlaceOnScreen;
FROM MagicStrings IMPORT Assign, Append, Length;
IMPORT MagicAES, MagicVDI;
CONST cStrMax = 50;
TYPE tString = ARRAY [0..cStrMax] OF CHAR;
tTedPtr = POINTER TO TEDINFO;
VAR Main: ARRAY [0..51] OF OBJECT;
MainTitle: TEDINFO;
Sub: ARRAY [0..51] OF OBJECT;
SubTitle: TEDINFO;
mainArea: AREA;
subArea: AREA;
SubBegin: sINTEGER;
b: sBITSET;
bool, rekExit: BOOLEAN;
screen: tRect;
mW, mH: sINTEGER;
moveable: BOOLEAN;
PROCEDURE DoMenu (t: tObjcTree; moveable: BOOLEAN; area: AREA): sINTEGER;
CONST Links = Bit0;
VAR x, y, ox, oy, i, f, j, o, d, xx, yy: sINTEGER;
ob, oldob, taste, scan, clicks, minobj: sINTEGER;
button, kbshift, event, b: sBITSET;
bool: BOOLEAN;
ascii: CHAR;
fr: tRect;
fa: AREA;
BEGIN
i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.XOR);
i:= MagicVDI.SetFillcolor (PrivateWS, 1);
bool:= MagicVDI.SetFillperimeter (PrivateWS, FALSE);
oldob:= -1; ob:= -1; ox:= -1; oy:= -1;
IF moveable THEN minobj:= 2; ELSE minobj:= 1; END;
StoreMouse;
WindUpdate (BEGMCTRL);
LOOP
event:= DoEvent (x, y, button, scan);
IF (x # ox) OR (y # oy) THEN
ob:= MagicAES.ObjcFind (t, 0, 999, x, y); ox:= x; oy:= y;
IF ob # oldob THEN
MouseOff; DrawBar (t, oldob); oldob:= -1;
IF (ob >= minobj) AND NOT (DISABLED IN t^[ob].obState) AND (SELECTABLE IN t^[ob].obFlags) THEN
DrawBar (t, ob); oldob:= ob;
END;
MouseOn;
END;
END;
IF (MUKEYBD IN event) THEN
IF MenuKeyboard (t, scan, minobj, oldob, ob) THEN
MouseOff; DrawBar (t, oldob); MouseOn; EXIT;
END;
IF ob # oldob THEN
MouseOff;
DrawBar (t, oldob); DrawBar (t, ob); oldob:= ob;
MouseOn;
END;
ELSIF (MUBUTTON IN event) THEN
IF (ob = 1) AND moveable THEN
MouseHand;
bool:= NewAREA (fa);
f:= ObjcFrame (t, 0); IF f < 0 THEN f:= ABS (f) ELSE f:= 0; END;
LOOP
MagicAES.GrafMkstate (x, y, button, b);
IF NOT (Links IN button) THEN EXIT; END;
IF (x # ox) OR (y # oy) THEN
CalcArea (t, 0, fr);
IF SaveArea (PrivateWS, fa, fr) THEN
MoveArea (PrivateWS, area, x - ox, y - oy, xx, yy);
t^[0].obY:= yy + f; t^[0].obX:= xx + f;
CalcArea (t, 0, fr); CopyArea (PrivateWS, fa, fr.x, fr.y);
ox:= x; oy:= y;
END;
END;
END; (* LOOP *)
CalcArea (t, 0, fr); CopyArea (PrivateWS, fa, fr.x, fr.y);
DisposeAREA (fa);
MouseArrow;
ELSE
LOOP
MagicAES.GrafMkstate (x, y, button, kbshift);
IF NOT (Links IN button) THEN EXIT; END;
o:= MagicAES.ObjcFind (t, 0, 999, x, y);
IF o # ob THEN EXIT; END;
END;
IF NOT (Links IN button) THEN
IF (ob >= minobj) THEN MouseOff; DrawBar (t, ob); MouseOn; END;
EXIT;
END;
END;
END;
END; (* LOOP *)
i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.REPLACE);
i:= MagicVDI.SetFillcolor (PrivateWS, 0);
RestoreMouse;
WindUpdate (ENDMCTRL);
IF (ob >= 0) & (DISABLED IN t^[ob].obState)
THEN
ob := -1
END;
RETURN ob;
END DoMenu;
PROCEDURE SetObjc (t: tObjcTree; objc, typ, x, y, w, h: sINTEGER;
f, s: sBITSET; spec: ADDRESS);
BEGIN
t^[objc].obNext:= -1;
t^[objc].obHead:= -1;
t^[objc].obTail:= -1;
t^[objc].obType:= typ;
t^[objc].obFlags:= f;
t^[objc].obState:= s;
t^[objc].obSpec.address:= spec;
t^[objc].obX:= x;
t^[objc].obY:= y;
t^[objc].obWidth:= w;
t^[objc].obHeight:= h;
MagicAES.ObjcAdd (t, 0, objc);
END SetObjc;
PROCEDURE PosMenu (menu: tObjcTree; ob, maxW, maxH: sINTEGER);
VAR x, y: sINTEGER;
b: sBITSET;
BEGIN
WITH menu^[0] DO
IF ob > 0 THEN
x:= Main[0].obX + Main[ob].obX + (Main[ob].obWidth DIV 2);
y:= Main[0].obY + Main[ob].obY - (CharWidth DIV 2);
ELSE
MagicAES.GrafMkstate (x, y, b, b);
END;
obX:= x; obY:= y; obWidth:= maxW; obHeight:= maxH;
PlaceOnScreen (menu);
END;
END PosMenu;
PROCEDURE MakeMenu (tree, menu: tObjcTree; title: ADDRESS;
subnum, type: sINTEGER): sINTEGER;
VAR maxW, maxH, num, i, j, ob, len, offset: sINTEGER;
ted: tTedPtr;
BEGIN
ted:= title; len:= ted^.teTxtlen;
j:= 0; num:= 0; maxW:= (len + 4) * CharWidth; maxH:= CharHeight + 1;
(*-- Basisobjekt --*)
menu^[num].obNext:= -1;
menu^[num].obHead:= -1;
menu^[num].obTail:= -1;
menu^[num].obType:= GBOX;
menu^[num].obFlags:= {};
menu^[num].obState:= {};
menu^[num].obSpec.Box.char:= 0C;
menu^[num].obSpec.Box.frame:= 377C;
menu^[num].obSpec.Box.flags:= {Bit12, Bit11};
menu^[num].obX:= 0;
menu^[num].obY:= 0;
menu^[num].obWidth:= 0;
menu^[num].obHeight:= 0;
INC (num);
(*-- Titelzeile --*)
SetObjc (menu, num, GBOXTEXT, 0, 0, 0, CharHeight, {}, {}, title);
INC (num);
(*-- Suchposition im Baum festlegen --*)
IF subnum > 0 THEN
ob:= SubBegin + 1;
FOR j:= 1 TO (subnum - 3) DO ob:= tree^[ob].obNext; END;
IF ob < SubBegin THEN RETURN -1; END;
offset:= ob - 1;
j:= tree^[ob].obHead;
ELSE
ob:= 2; offset:= 1; j:= 0;
END;
(*-- Objekte addieren --*)
LOOP
i:= ScanFlags (tree, SearchType, j, type);
IF tree^[i].obWidth > maxW THEN maxW:= tree^[i].obWidth; END;
INCL (tree^[i].obFlags, SELECTABLE);
SetObjc (menu, num, tree^[i].obType, 0, maxH, tree^[i].obWidth,
CharHeight, tree^[i].obFlags, tree^[i].obState, tree^[i].obSpec.address);
INC (num); INC (maxH, CharHeight); j:= i + 1;
IF i = tree^[ob].obTail THEN EXIT; END;
END;
SameLength (menu, num, maxW);
PosMenu (menu, subnum, maxW, maxH);
(*-- Offset fr weitere Suche merken --*)
IF subnum = 0 THEN SubBegin:= j; END;
RETURN offset;
END MakeMenu;
PROCEDURE PopupMenu (menu: ADDRESS; title: ARRAY OF CHAR): sINTEGER;
VAR i, j, m, s, ret, len, ob, oldob, off1, off2: sINTEGER;
r: tRect;
bool: BOOLEAN;
t: tObjcTree;
BEGIN
IF menu = NIL THEN RETURN -1; END;
ScreenDim (mW, mH);
ret:= -1; t:= menu; len:= Length (title); j:= 0;
MainTitle.tePtext:= ADR (title);
MainTitle.tePtmplt:= ADR (title);
MainTitle.tePvalid:= ADR (title);
MainTitle.teFont:= 3;
MainTitle.teFontid:= 0;
MainTitle.teJust:= 2;
MainTitle.teColor:= 011A1H;
MainTitle.teFontsize:= 0;
MainTitle.teThickness:= -1;
MainTitle.teTxtlen:= len;
MainTitle.teTmplen:= len;
off1:= MakeMenu (t, ADR(Main), ADR(MainTitle), 0, GTITLE);
CalcArea (ADR(Main), 0, r);
bool:= SaveArea (PrivateWS, mainArea, r);
moveable:= TRUE;
ObjcDraw (ADR(Main), 0, 8, screen);
MouseOn;
LOOP
m:= DoMenu (ADR(Main), TRUE, mainArea) + off1;
IF m < 1 THEN ret:= -1; EXIT; END;
IF Exit IN t^[m].obFlags THEN ret:= m; EXIT; END;
IF m > 2 THEN
len:= Length (Main[m - off1].obSpec.StringPtr^);
SubTitle.tePtext:= ADDRESS (Main[m - off1].obSpec.StringPtr);
SubTitle.tePtmplt:= ADDRESS (Main[m - off1].obSpec.StringPtr);
SubTitle.tePvalid:= ADDRESS (Main[m - off1].obSpec.StringPtr);
SubTitle.teFont:= 3;
SubTitle.teFontid:= 0;
SubTitle.teJust:= 2;
SubTitle.teColor:= 011A1H;
SubTitle.teFontsize:= 0;
SubTitle.teThickness:= -1;
SubTitle.teTxtlen:= len;
SubTitle.teTmplen:= len;
off2:= MakeMenu (t, ADR(Sub), ADR(SubTitle), m, GSTRING);
CalcArea (ADR(Sub), 0, r);
bool:= SaveArea (PrivateWS, subArea, r);
ObjcDraw (ADR(Sub), 0, 8, screen);
s:= DoMenu (ADR(Sub), TRUE, subArea);
RestoreArea (PrivateWS, subArea);
IF s > 0 THEN ret:= s + off2; EXIT; END;
END; (* IF m > 2 *)
END; (* LOOP *)
RestoreArea (PrivateWS, mainArea);
FreeArea (subArea);
FreeArea (mainArea);
RETURN ret;
END PopupMenu;
VAR posmode: (mouse, pos);
posX, posY: INTEGER;
PROCEDURE StringPopup (REF string: ARRAY OF CHAR; title: ARRAY OF CHAR): sINTEGER;
VAR i, j, m, s, l1, l2, maxW, maxH, num: sINTEGER;
mr, sr: tRect;
bool: BOOLEAN;
StrArray: ARRAY [0..49] OF tString;
t: tObjcTree;
BEGIN
ScreenDim (mW, mH);
l1:= Length (string); l2:= Length (title);
i:= 0; j:= 0; num:= 0;
(*-- Basisobjekt --*)
Main[num].obNext:= -1;
Main[num].obHead:= 1;
Main[num].obTail:= 0;
Main[num].obType:= GBOX;
Main[num].obFlags:= {};
Main[num].obState:= {MagicAES.SHADOWED};
Main[num].obSpec.Box.char:= 0C;
Main[num].obSpec.Box.frame:= 377C;
Main[num].obSpec.Box.flags:= {Bit12, Bit11};
Main[num].obX:= 0;
Main[num].obY:= 0;
Main[num].obWidth:= 0;
Main[num].obHeight:= 0;
INC (num);
IF l2 > 0 THEN
(*-- Titelzeile --*)
SetObjc (ADR(Main), num, GBOXTEXT, 0, 0, 0, CharHeight, {}, {}, ADR(MainTitle));
INC (num);
MainTitle.tePtext:= ADR (title);
MainTitle.tePtmplt:= ADR (title);
MainTitle.tePvalid:= ADR (title);
MainTitle.teFont:= 3;
MainTitle.teFontid:= 0;
MainTitle.teJust:= 2;
MainTitle.teColor:= 011A1H;
MainTitle.teFontsize:= 0;
MainTitle.teThickness:= -1;
MainTitle.teTxtlen:= l2;
MainTitle.teTmplen:= l2;
moveable:= TRUE;
maxH:= CharHeight + 1;
ELSE
moveable:= FALSE;
maxH:= 0;
END;
i:= 0; j:= 0; maxW:= (l2 + 2)* CharWidth;
LOOP
s:= 0;
WHILE (i < l1) AND (string[i] # '|') AND (s < cStrMax) DO
StrArray[j, s]:= string[i]; INC (i); INC (s);
END;
StrArray[j, s]:= 0C;
SetObjc (ADR(Main), num, GSTRING, 0, maxH, (s + 2) * CharWidth, CharHeight,
{SELECTABLE}, {}, ADR(StrArray[j]));
(* Korrektur von maxW fr Items breiter als die Titelzeile. Steffen Engel *)
maxW := Max (maxW, (s + 1) * CharWidth);
INC (num); INC (j); INC (maxH, CharHeight);
IF string[i] = 0C THEN EXIT; ELSE INC (i); END;
END;
SameLength (ADR(Main), num, maxW);
IF posmode = mouse THEN
PosMenu (ADR(Main), 0, maxW, maxH);
ELSE
WITH Main[0] DO
obX:= posX; obY:= posY; obWidth:= maxW; obHeight:= maxH;
PlaceOnScreen (ADR(Main));
END;
END;
CalcArea (ADR(Main), 0, mr);
bool:= SaveArea (PrivateWS, mainArea, mr);
ObjcDraw (ADR(Main), 0, 8, screen);
MouseOn;
m:= DoMenu (ADR(Main), moveable, mainArea);
RestoreArea (PrivateWS, mainArea);
FreeArea (mainArea);
IF m > 0 THEN RETURN m - 1; ELSE RETURN -1; END;
END StringPopup;
PROCEDURE PosPopup (x, y: INTEGER; REF string: ARRAY OF CHAR;
title: ARRAY OF CHAR): sINTEGER;
VAR i: INTEGER;
BEGIN
posmode:= pos; posX:= x; posY:= y;
i:= StringPopup (string, title);
posmode:= mouse;
RETURN i;
END PosPopup;
PROCEDURE TreePopup (tree: ADDRESS; x, y: sINTEGER; idx: sINTEGER): sINTEGER;
VAR m,j : sINTEGER;
mr, sr: tRect;
bool: BOOLEAN;
t: tObjcTree;
BEGIN
t:= tree;
ScreenDim (mW, mH);
WITH t^[0] DO
obX:= x; obY:= y; DEC (obY, idx * CharHeight);
END;
PlaceOnScreen (t);
CalcArea (t, 0, mr);
bool:= SaveArea (PrivateWS, mainArea, mr);
ObjcDraw (t, 0, 8, screen);
MouseOn;
m:= DoMenu (t, FALSE, mainArea);
RestoreArea (PrivateWS, mainArea);
FreeArea (mainArea);
IF m > 0 THEN RETURN m; ELSE RETURN -1; END;
END TreePopup;
VAR init : INTEGER;
PROCEDURE InitMtPopups;
BEGIN
IF init # 24867
THEN
screen.x:= DeskX;
screen.y:= DeskY;
screen.w:= MaxWidth;
screen.h:= MaxHeight;
bool:= NewAREA (mainArea);
bool:= NewAREA (subArea);
posmode:= mouse;
init := 24867
END;
END InitMtPopups;
BEGIN
init := 0;
InitMtPopups;
END mtPopups.